package icasue.tools.sqlhelper.annotation;

import icasue.tools.sqlhelper.common.Const;

import java.lang.annotation.*;

/**
 * @Author: Qiao Hang
 * @CreateDate: 2021/9/30 上午9:37
 * @UpdateDate:
 * @Description: 聚簇索引声明.
 */
@Target(ElementType.TYPE)
@Repeatable(Group.IndexGRepeat.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface IndexG {
    // 聚簇索引名称.
    String name() default Const.$EMPTY;

    // 被索引的列名字 (注意先后顺序很重要!).
    String[] value();

    // 聚簇索引权重 [0.0 - 1.0], 默认1.0f
    float weight() default 1.0f;

    /**
     * 该索引/聚簇索引 在索引组内的权值.
     * 该字段主要是为聚簇索引设计, 例如针对千万/亿级数据存储的情况下，
     * 可能落在该表上的业务查询条件复杂多变，一旦考虑数据库性能，
     * 按照业务需要对部分列创建聚簇索引是在所难免的，再考虑业务的复杂性，
     * 可能在某列上创建了多个聚簇索引，例如针对`col1`有如下多组索引声明:
     *  mixed_index1(`sex`,`age`,`hobby`),
     *  mixed_index2(`sex`,`name`,`birth`),
     *  mixed_index2(`hobby`,`birth`,`age`,`name`),
     *
     * 此时面向对象的动态查询需要尽可能智能化的去偏向更合适的索引，例如有如下Java实例:
     *  User(sex = "man", age = 10, name = "casue",  ... )
     *
     * !!! 此时如果不加权重，索引选择仅靠【逻辑索引使用率】去决策的话，那使用 [索引mixed_index1 或者 索引mixed_index2]
     * !!! 都认为需要扫描的数据库行数是近似的(查询性能差距不大)(逻辑索引使用率均为60%)，但实际真是这样的么? 很明显不是的，
     * !!! 一旦使用 [索引mixed_index1] 去查询数据库，则 [索引的真实使用率] 将降低，假设数据量足够大，用户年龄的分布
     * !!! 是均匀的(1-100)，而用户名称的相似度趋近于0%，那么使用(sex,age...)的索引查询比使用(sex,name...)索引性能低约100倍!
     *
     * !!!!!! 因此引入索引组权值，用于用户根据数据库字段实际的存储特点，给出该组聚簇索引的权值，
     *        以满足生成的动态SQL：[索引真实使用率 = 索引逻辑使用率 * 权值]
     */
}

